package cn.iocoder.yudao.module.diy.service.addon;

import cn.hutool.http.HttpUtil;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.diy.compoent.EventAndSubscribeOfPublisher;
import cn.iocoder.yudao.module.diy.event.AddonAddAfterEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.*;

import cn.iocoder.yudao.module.diy.controller.admin.addon.vo.*;
import cn.iocoder.yudao.module.diy.dal.dataobject.addon.AddonDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.diy.dal.mysql.addon.AddonMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.diy.enums.ErrorCodeConstants.*;

/**
 * 装修插件 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class AddonServiceImpl implements AddonService {

    @Resource
    private AddonMapper addonMapper;
    @Resource
    private ApplicationContext applicationContext;

    @Override
    public Long createAddon(AddonSaveReqVO createReqVO) {
        // 插入
        AddonDO addon = BeanUtils.toBean(createReqVO, AddonDO.class);
        addonMapper.insert(addon);
        // 返回
        return addon.getId();
    }

    @Override
    public void updateAddon(AddonSaveReqVO updateReqVO) {
        // 校验存在
        validateAddonExists(updateReqVO.getId());
        // 更新
        AddonDO updateObj = BeanUtils.toBean(updateReqVO, AddonDO.class);
        addonMapper.updateById(updateObj);
    }

    @Override
    public void deleteAddon(Long id) {
        // 校验存在
        validateAddonExists(id);
        // 删除
        addonMapper.deleteById(id);
    }

    private void validateAddonExists(Long id) {
        if (addonMapper.selectById(id) == null) {
            throw exception(ADDON_NOT_EXISTS);
        }
    }

    @Override
    public AddonDO getAddon(Long id) {
        return addonMapper.selectById(id);
    }

    @Override
    public PageResult<AddonDO> getAddonPage(AddonPageReqVO pageReqVO) {
        return addonMapper.selectPage(pageReqVO);
    }

    @Override
    @Transactional
    public List<AddonDO> getAddonList(AddonDO param) {
        return addonMapper.selectList(param);
    }

    @Override
    public List<AddonDO> getAddonListByTenantId(Long tenantId) {
        return addonMapper.getAddonListByTenantId(tenantId);
    }


    @Override
    public List<AddonDO> getDefaultAddon() {
        return addonMapper.getDefaultAddon();
    }

    @Override
    public void createDefaultAddon(Long siteId) {
        if(null==siteId){
            siteId = TenantContextHolder.getTenantId();
        }
        List<AddonDO> tenantAddons = addonMapper.selectList(new AddonDO());
        if (null == tenantAddons || tenantAddons.size() == 0) {
            List<AddonDO> defaultAddons = addonMapper.getDefaultAddon();
            for (AddonDO defaultAddon : defaultAddons) {
                AddonDO newAddon = new AddonDO();
                newAddon.setAddonKey(defaultAddon.getAddonKey());
                newAddon.setTenantId(TenantContextHolder.getTenantId());
                newAddon.setSiteId(siteId);
                newAddon.setAddonStatus(defaultAddon.getAddonStatus());
                newAddon.setAddonUrl(defaultAddon.getAddonUrl());
                newAddon.setAddonDesc(defaultAddon.getAddonDesc());
                newAddon.setAddonKey(defaultAddon.getAddonKey());
                newAddon.setType(defaultAddon.getType());
                newAddon.setInstallTime(LocalDateTime.now());
                newAddon.setTitle(defaultAddon.getTitle());
                addonMapper.insert(newAddon);
                //创建页面后创建页面和基础配置
                AddonAddAfterEvent event = new AddonAddAfterEvent();
                event.setTenantId(TenantContextHolder.getTenantId());
                event.setSiteId(siteId);
                event.addAppSign("core");
                event.setName("AddonAddAfterEvent");
                event.setAddonDO(newAddon);
//        SpringContext.get().publishEvent(event);
//        applicationContext.publishEvent(event);
                EventAndSubscribeOfPublisher.publishAll(event);
            }
        }
    }

    @Override
    public void createDefaultAddonByTenantId(Long tenantId,Long siteId) {
        List<AddonDO> tenantAddons = addonMapper.getAddonListByTenantId(tenantId);
        if (null == tenantAddons || tenantAddons.size() == 0) {
            List<AddonDO> defaultAddons = addonMapper.getDefaultAddon();
            for (AddonDO defaultAddon : defaultAddons) {
                AddonDO newAddon = new AddonDO();
                newAddon.setAddonKey(defaultAddon.getAddonKey());
                newAddon.setTenantId(tenantId);
                newAddon.setSiteId(siteId!=null?siteId:tenantId);
                newAddon.setAddonStatus(defaultAddon.getAddonStatus());
                newAddon.setAddonUrl(defaultAddon.getAddonUrl());
                newAddon.setAddonDesc(defaultAddon.getAddonDesc());
                newAddon.setAddonKey(defaultAddon.getAddonKey());
                newAddon.setType(defaultAddon.getType());
                newAddon.setInstallTime(LocalDateTime.now());
                newAddon.setTitle(defaultAddon.getTitle());
                addonMapper.insert(newAddon);

                //创建页面后创建页面和基础配置
                AddonAddAfterEvent event = new AddonAddAfterEvent();
                event.setTenantId(tenantId);
                event.setSiteId(siteId!=null?siteId:tenantId);
                event.addAppSign("core");
                event.setName("AddonAddAfterEvent");
                event.setAddonDO(newAddon);
                EventAndSubscribeOfPublisher.publishAll(event);
            }
        }
    }

    public static void main(String[] args) {
        //功能：
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("api_key", "cHEsDpczNRyux9Kbok4g9pCXhWHolQgc");
        paramMap.put("api_secret", "sAnOmX0mA7pkIxVvU80C3-7DBRxCle63");
        paramMap.put("image_url", "https://img1.baidu.com/it/u=2573173342,1468769965&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=667");

        String result= HttpUtil.post("https://api-cn.faceplusplus.com/facepp/v1/skinanalyze_pro", paramMap);
        System.out.println(result);
    }


}